package zhan.shiro.filter;

import org.apache.log4j.Logger;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class UserFromAuthenticationFilter extends FormAuthenticationFilter {
    public static final Logger log = Logger.getLogger(UserFromAuthenticationFilter.class);

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
//        this.pathsMatch(request.get)
        if (this.isLoginRequest(request, response)) {
            if (this.isLoginSubmission(request, response)) {
                log.info("执行登录操作");
                /** executeLogin(request, response) 方法表示执行登录操作，不用我们在自己写登陆操作了 */
                return this.executeLogin(request, response);
            } else {
                return true;
            }
        }
//        // 在这里进行验证码的校验
//        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
//        HttpSession session = httpServletRequest.getSession();
//
//        // 取出验证码
//        String validateCode = (String) session.getAttribute("validateCode");
//        // 取出页面的验证码
//        // 输入的验证和session中的验证进行对比
//        String randomcode = httpServletRequest.getParameter("randomcode");
//        if (randomcode != null && validateCode != null && !randomcode.equals(validateCode)) {
//            // 如果校验失败，将验证码错误失败信息，通过shiroLoginFailure设置到request中
//            httpServletRequest.setAttribute("shiroLoginFailure", "randomCodeError");
//            // 拒绝访问，不再校验账号和密码
//            return true;
//        }
            return super.onAccessDenied(request, response);
    }

    /**
     * 因为项目启动时第一次默认路径时根 /，并将其保存在session中，所以shiro在登陆成功后会默认跳到/路径下面，
     * 从而使得在配置文件中配置的successUrl失效（在也是为什么说successUrl是一种附加配置，因为第一次进入时不一定就是我们
     * 配置的successUrl。所以在这里重写onLoginSuccess方法指定成功登陆后跳转的路径）
     *
     *下面3种方式均可实现成功跳转问题
     */
    @Override
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {

        //方式一
        //WebUtils.getAndClearSavedRequest(request);
        //WebUtils.redirectToSavedRequest(request,response,"/user/list");         //这里需return false
        //方式二
          WebUtils.issueRedirect(request,response,getSuccessUrl());               //这里需return false
          return false;

        //方式三
//        if (!StringUtils.isEmpty(getSuccessUrl())) {
//            Session session = subject.getSession(false);  查询session如果有则返回没有则null  如果参数为true则是没有就创建一个新的
//            if (session != null) {
//                session.removeAttribute("shiroSavedRequest"); 清除特定的key
//            }
//        }
        //return super.onLoginSuccess(token, subject, request, response);         //第三种方式
    }

}
